package org.wmq.taskschedule.algorithm;

import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

/**
 * 中值模糊算法执行器
 * 实现AlgorithmExecutor接口，用于对图像进行中值模糊处理
 */
public class MedianBlurExecutor implements AlgorithmExecutor {

    private int kernelSize; // 核大小（必须是奇数且大于1）
    private String description; // 算法描述

    /**
     * 默认构造函数，使用默认参数
     */
    public MedianBlurExecutor() {
        this.kernelSize = 3;
        this.description = "中值模糊算法 - 对图像进行中值滤波，有效去除椒盐噪声";
    }

    /**
     * 构造函数，允许自定义参数
     * 
     * @param kernelSize 核大小（必须是奇数且大于1）
     */
    public MedianBlurExecutor(int kernelSize) {
        if (kernelSize % 2 == 0 || kernelSize <= 1) {
            throw new IllegalArgumentException("核大小必须是奇数且大于1");
        }
        this.kernelSize = kernelSize;
        this.description = "中值模糊算法 - 对图像进行中值滤波，有效去除椒盐噪声";
    }

    /**
     * 构造函数，允许自定义所有参数
     * 
     * @param kernelSize 核大小（必须是奇数且大于1）
     * @param description 算法描述
     */
    public MedianBlurExecutor(int kernelSize, String description) {
        if (kernelSize % 2 == 0 || kernelSize <= 1) {
            throw new IllegalArgumentException("核大小必须是奇数且大于1");
        }
        this.kernelSize = kernelSize;
        this.description = description;
    }

    @Override
    public Mat execute(Mat input) {
        if (input == null || input.empty()) {
            throw new IllegalArgumentException("输入图像不能为空");
        }

        // 创建输出图像
        Mat output = new Mat();

        // 应用中值模糊算法
        Imgproc.medianBlur(input, output, kernelSize);

        return output;
    }

    // Getters and setters
    public int getKernelSize() {
        return kernelSize;
    }

    public void setKernelSize(int kernelSize) {
        if (kernelSize % 2 == 0 || kernelSize <= 1) {
            throw new IllegalArgumentException("核大小必须是奇数且大于1");
        }
        this.kernelSize = kernelSize;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}